#ifndef GD32F4_GPIO_H
#define GD32F4_GPIO_H

#include "gd32f4xx.h"

/**
 * @brief 配置GPIO引脚为输入模式
 * @param rcu   RCU_GPIOX    【时钟端口】
 * @param port  GPIOX        【端口】
 * @param pin   GPIO_PIN_x   【引脚编号】
 * @param pupd  上拉/下拉：
 *              @arg GPIO_PUPD_NONE    浮空输入
 *              @arg GPIO_PUPD_PULLUP  上拉输入
 *              @arg GPIO_PUPD_PULLDOWN 下拉输入
 * @note 
 * 1. 浮空输入模式下，引脚必须确保外部有确定电平
 */
static inline void GPIO_Input_Cfg(
    rcu_periph_enum rcu,
    uint32_t port,
    uint32_t pin,
    uint32_t pupd){
    /* 使能GPIO时钟 */
    rcu_periph_clock_enable(rcu);
    
    /* 配置GPIO输入模式 */
    gpio_mode_set(port, GPIO_MODE_INPUT, pupd, pin);
    }


    
/**
 * @brief 配置GPIO引脚为输出模式(非复用,默认无上/下拉)
 * @param rcu   RCU_GPIOX    【时钟端口】
 * @param port  GPIOX        【端口】
 * @param pin   GPIO_PIN_x   【引脚编号】
 * @param otype 输出类型：
 *              @arg GPIO_OTYPE_PP  推挽输出
 *              @arg GPIO_OTYPE_OD  开漏输出
 * @param flag  初始电平：
 *              @arg 0 初始为低电平
 *              @arg 1 初始为高电平
 *              @arg 2 不设置初始电平
 */
static inline void GPIO_Output_Cfg(
    rcu_periph_enum rcu,
    uint32_t port,
    uint32_t pin,
    uint8_t otype,
    uint8_t flag) {
    /* 使能GPIO时钟 */
    rcu_periph_clock_enable(rcu);
    
    /* 配置GPIO输出模式（默认无上拉下拉） */
    gpio_mode_set(port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);
    
    gpio_output_options_set(port, otype, GPIO_OSPEED_50MHZ, pin);
    
    /* 设置初始电平 */
    if(flag!=2){
        gpio_bit_write(port,pin, flag ? SET : RESET);
    }
}



/**
 * @brief GPIO引脚配置->复用输出
 * @param rcu   RCU_GPIOx       【时钟控制端口】
 * @param port  GPIOx           【端口】
 * @param pin   GPIO_PIN_x      【引脚编号】
 * @param af    GPIO_AF_x       【复用引脚】
 * @param otype 输出类型：
 *              @arg GPIO_OTYPE_PP  推挽输出
 *              @arg GPIO_OTYPE_OD  开漏输出
 * @param pupd  上拉/下拉：
 *              @arg GPIO_PUPD_NONE     浮空
 *              @arg GPIO_PUPD_PULLUP   上拉
 *              @arg GPIO_PUPD_PULLDOWN 下拉
 * @note 1. 开漏输出建议外接上拉电阻
 *       2. 高速模式会增加功耗
 */
static inline void GPIO_Output_Af_Cfg(
    rcu_periph_enum rcu,
    uint32_t port,
    uint32_t pin,
    uint32_t af,
    uint8_t otype,
    uint32_t pupd){
    /* 使能GPIO时钟 */
    rcu_periph_clock_enable(rcu);

    /* 配置GPIO模式：复用功能 + 上拉/下拉 */
    gpio_mode_set(port, GPIO_MODE_AF, pupd, pin);

    /* 设置输出参数：推挽/开漏 + 速度 */
    gpio_output_options_set(port, otype, GPIO_OSPEED_50MHZ, pin);

    /* 配置复用功能 */
    gpio_af_set(port, af, pin);
    }

#endif // GD32F4_GPIO_H



